/**
  ******************************************************************************
  * @file    sys.h 
  * @author  TONLY
  * @version V1.0
  * @date    2022-01-01
  * @brief   系统配置
  ******************************************************************************
  * @attention
  * 
  *	本程序只供学习使用，未经作者许可，不得用于其它任何用途
  *	版权所有，盗版必究
  *
  * <h2><center>&copy; COPYRIGHT 2022 华清-TONLY </center></h2>
  ******************************************************************************
  */ 

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __SYS_H
#define __SYS_H


/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"


/* Exported define ----------------- -----------------------------------------*/
#define SYSTEM_SUPPORT_OS		0	//定义是否支持OS  0:不支持   1:支持

#define ODR_OFFSET		0x0C		// 输出寄存器地址偏移
#define IDR_OFFSET		0x08		// 输入寄存器地址偏移

/* 位带操作 */
#define BITBAND(addr, bitnum) 	((addr&0xF0000000)+0x2000000+((addr&0xFFFFF)<<5)+(bitnum<<2))

//通过地址取值操作
#define MEM_ADDR(addr)  		*((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum)  MEM_ADDR(BITBAND(addr, bitnum))

/* 输出寄存器 IO口地址映射 */
#define GPIOA_ODR_Addr		(GPIOA_BASE+ODR_OFFSET)
#define GPIOB_ODR_Addr		(GPIOB_BASE+ODR_OFFSET)
#define GPIOC_ODR_Addr		(GPIOC_BASE+ODR_OFFSET)
#define GPIOD_ODR_Addr		(GPIOD_BASE+ODR_OFFSET)
#define GPIOE_ODR_Addr		(GPIOE_BASE+ODR_OFFSET)
#define GPIOF_ODR_Addr		(GPIOF_BASE+ODR_OFFSET)
#define GPIOG_ODR_Addr		(GPIOG_BASE+ODR_OFFSET)

/* 输入寄存器 IO口地址映射 */
#define GPIOA_IDR_Addr		(GPIOA_BASE+IDR_OFFSET)
#define GPIOB_IDR_Addr		(GPIOB_BASE+IDR_OFFSET)
#define GPIOC_IDR_Addr		(GPIOC_BASE+IDR_OFFSET)
#define GPIOD_IDR_Addr		(GPIOD_BASE+IDR_OFFSET)
#define GPIOE_IDR_Addr		(GPIOE_BASE+IDR_OFFSET)
#define GPIOF_IDR_Addr		(GPIOF_BASE+IDR_OFFSET)
#define GPIOG_IDR_Addr		(GPIOG_BASE+IDR_OFFSET)

/* 输入输出 (n的值小于16)*/
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出 
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入 

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出 
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入 

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出 
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入 

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出 
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出 
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出 
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入


/* Exported functions ------------------------------------------------------- */
extern void WFI_SET(void);		//执行WFI指令
extern void INTX_DISABLE(void);	//关闭所有中断
extern void INTX_ENABLE(void);	//开启所有中断
extern void MSR_MSP(u32 addr);	//设置堆栈地址   addr：栈顶指针

#endif  /* __SYS_H */

/******************* (C) COPYRIGHT 2022 华清-TONLY *************END OF FILE****/
